package com.mtoolkit.socket.server;

import java.util.ArrayList;
import java.util.List;

import com.mtoolkit.socket.SocketRequest;
import com.mtoolkit.socket.SocketResponse;

/**
 * 服务端事件触发器。
 * 用于在适当的时候通过触发服务器事件，通知在册的事件处理器对事件做出响应。
 * 触发器以Singleton模式实现，统一控制整个服务器端的事件，避免造成混乱。
 */
public class NioServerEventNotifier {

	private static NioServerEventNotifier instance;
    private static List<NioServerEventListener> listeners;

    private NioServerEventNotifier() {
        listeners = new ArrayList<NioServerEventListener>();
    }

    public static synchronized NioServerEventNotifier getNotifier() {
        if (instance == null) {
            instance = new NioServerEventNotifier();
        }
        return instance;
    }

    /**
     * 注册事件监听器。
     * @param listener 事件监听器。
     */
    public void registerListener(NioServerEventListener listener) {
        synchronized (listeners) {
            if (!listeners.contains(listener)) {
                listeners.add(listener);
            }
        }
    }

    void fireOnAccept() {
        for (int i = 0; i < listeners.size(); i++) {
            listeners.get(i).onAccept();
        }
    }

    void fireOnAccepted(SocketRequest request) {
        for (int i = 0; i < listeners.size(); i++) {
            listeners.get(i).onAccepted(request);
        }
    }

    void fireOnReaded(SocketRequest request) {
        for (int i = 0; i < listeners.size(); i++) {
            listeners.get(i).onReaded(request);
        }
    }

    void fireOnWrite(SocketRequest request, SocketResponse response) {
        for (int i = 0; i < listeners.size(); i++) {
            listeners.get(i).onWrite(request, response);
        }
    }

    void fireOnClosed(SocketRequest request) {
        for (int i = 0; i < listeners.size(); i++) {
            listeners.get(i).onClosed(request);
        }
    }

    void fireOnError(Exception exception) {
        for (int i = 0; i < listeners.size(); i++) {
            listeners.get(i).onError(exception);
        }
    }
    
}
